leetcode 探索 鏈表 兩數相加

題目

將兩個升序鏈表合併爲一個新的 升序 鏈表並返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。
示例:

輸入:1->2->4, 1->3->4
輸出:1->1->2->3->4->4

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/merge-two-sorted-lists

分析

合併鏈表,此題比較簡單,但要注意的事情有以下三點。

  1. 該位上的和如果大於等於10的話,需要進位,那麼需要將該進位攜帶到下一輪。
  2. 如果最後兩個鏈表都到頭了,但是進位上仍然有值,那麼需要新建一個節點存儲該值,並連接到鏈表裏。
  3. 如果有一個鏈表到頭了,另外一個鏈表仍然是要計算結果的,比如在一個鏈表到頭時候,進位了1,另外一鏈表上的剩餘數據是9->9->9這樣的,需要一直計算的。

解法

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
    var head = &ListNode{}
    cur := head
    var a, b, add int
    for {
        if l1 == nil && l2 == nil {
        	// 如果遇到兩者都結束了,但是add進位上仍然有值,那麼仍然要爲其新建一個節點,存儲該值。
            if add > 0 {
                cur.Next = &ListNode{
                    Val: add,
                }
            }
            break
        }
        // 不爲nil的l1和l2指針都要給出值,並前進。
        if l1 != nil {
            a = l1.Val
            l1 = l1.Next
        }
        if l2 != nil {
            b = l2.Val
            l2 = l2.Next
        }
        // 將其與進位值add相加得到和,並計算其餘數和新的進位值
        sum := a + b + add
        add = sum / 10
        sum = sum % 10 
        cur.Next = &ListNode{
            Val: sum,
        }
        cur = cur.Next
        // 爲什麼要置0呢,因爲下一輪假如有l1或者l2指針已經爲nil了,那麼該值將會被重複計算,所以清零
        a, b = 0, 0
    }
    return head.Next
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章