题目:
将两个有序链表合并为一个新的有续链表并返回。新链表是通过拼接给定的两个链表的所有节点做成的。
思路:
1、如果给定的两条链表中有一条为空,返回另一条即可
2、若两条链表都不为空,则在两条链表中选择较小的节点作为head,被选中的较小节点所在链表的第二个节点便成了二当家带领这条链表
3、二当家带领着这条链表与另一条链表进行比较,始终选择较小的节点连在head后面。
4、连接好后在返回head时发现,此时的head是合成后的链表的最后一个节点,而不是头结点。解决方法是,在第二部选定头节点时,同时将这个头结点多赋予一个变量,同时保持这个标量不动,它始终保存的是头结点,这样到最后返回他就好了,因为存的都是地址啊,与变量名无关。
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
// ListNode 是链接节点
type ListNode struct {
Val int
Next *ListNode
}
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
// 有一条链为nil,直接返回另一条链
if l1 == nil {
return l2
}
if l2 == nil {
return l1
}
// 此时,两条链都不为nil,可以直接使用l.Val,而不用担心panic
// 在l1和l2之间,选择较小的节点作为head,并设置好node
var head, node *ListNode
if l1.Val < l2.Val {
head = l1
node = l1
l1 = l1.Next
} else {
head = l2
node = l2
l2 = l2.Next
}
// 循环比较l1和l2的值,始终选择较小的值连上node
for l1 != nil && l2 != nil {
if l1.Val < l2.Val {
node.Next = l1
l1 = l1.Next
} else {
node.Next = l2
l2 = l2.Next
}
// 有了这一步,head才是一个完整的链
node = node.Next
}
if l1 != nil {
// 连上l1剩余的链
node.Next = l1
}
if l2 != nil {
// 连上l2剩余的链
node.Next = l2
}
return head
}