第一题 两数相加

题目

image.png

解题思路

image.png

详细代码

func addTwoNumbers(l1, l2 *ListNode) (head *ListNode) {
    var tail *ListNode
    carry := 0
    for l1 != nil || l2 != nil {
        n1, n2 := 0, 0
        if l1 != nil {
            n1 = l1.Val
            l1 = l1.Next
        }
        if l2 != nil {
            n2 = l2.Val
            l2 = l2.Next
        }
        sum := n1 + n2 + carry
        sum, carry = sum%10, sum/10
        if head == nil {
            head = &ListNode{Val: sum}
            tail = head
        } else {
            tail.Next = &ListNode{Val: sum}
            tail = tail.Next
        }
    }
    //如果两数相加之后产生了进位,则增加一个新的节点
    if carry > 0 {
        tail.Next = &ListNode{Val: carry}
    }
    return
}

复杂度分析

时间复杂度:O(max(m,n)),其中 m 和 n 分别为两个链表的长度。我们要遍历两个链表的全部位置,而处理每个位置只需要 O(1) 的时间。

空间复杂度:O(1)。注意返回值不计入空间复杂度。

第二题 奇偶链表

题目

image.png

解题思路

image.png
image.png

代码

func oddEvenList(head *ListNode) *ListNode {
    //如果链表为空,则直接返回链表。
    if head == nil {
        return head
    }
    //第一个奇偶节点  odd奇数的  even偶数的
    evenHead := head.Next
    odd := head
    even := evenHead
    //将原链表分别连接到奇偶链表
    for even != nil && even.Next != nil {
        odd.Next = even.Next
        odd = odd.Next
        even.Next = odd.Next
        even = even.Next
    }
    //偶链表加到奇链表后
    odd.Next = evenHead
    return head
}

复杂度分析

时间复杂度:O(n),其中 n 是链表的节点数。需要遍历链表中的每个节点,并更新指针。

空间复杂度:O(1)。只需要维护有限的指针。
image.png


wric
10 声望3 粉丝