題目
將兩個升序鏈表合併爲一個新的 升序 鏈表並返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。
示例:
輸入:1->2->4, 1->3->4
輸出:1->1->2->3->4->4
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/merge-two-sorted-lists
分析
合併鏈表,此題比較簡單,但要注意的事情有以下三點。
- 該位上的和如果大於等於10的話,需要進位,那麼需要將該進位攜帶到下一輪。
- 如果最後兩個鏈表都到頭了,但是進位上仍然有值,那麼需要新建一個節點存儲該值,並連接到鏈表裏。
- 如果有一個鏈表到頭了,另外一個鏈表仍然是要計算結果的,比如在一個鏈表到頭時候,進位了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
}