题目
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入: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
}
本文介绍了一种将两个升序链表合并成一个新升序链表的方法。新链表由给定的两个链表的所有节点组成。文章详细讨论了解决方案中需要注意的三个关键点:处理进位、链表结束时的特殊情况以及单侧链表继续计算的情况。
739

被折叠的 条评论
为什么被折叠?



