版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/scylhy/article/details/87967180
21. 合并两个有序链表-E
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
输入:[]
输出:[1]
-
分析
这道题,就是合并两个链表,使用方法就是,两层循环,外层l1迭代,内层l2迭代,这样l1肯定能迭代完,但是l2可能剩下部分,故最后再对剩下的l2迭代;
新学到的,dummy Head,方法,再不用处理p==nil的问题了,可以直接使用p.Next;最后返回head.Next就行,巧啊。 -
code2
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
var head,p *ListNode
head=&ListNode{0,nil};p=head //dumyhead,不用再处理p==nil的情况,直接用p.Next就行
for l1!=nil { //双层,每层控制一个链的思路清晰,比较容易;若两个链都在一个循环控制就稍微复杂了
for l2!=nil&&l2.Val<=l1.Val{
p.Next=l2;p=p.Next;l2=l2.Next
}
p.Next=l1;p=p.Next;l1=l1.Next
}
p.Next=l2 //最后剩下的,l2,也不用遍历了,直接链上头就可以了
return head.Next
}
- code1
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
var head,p *ListNode
for l1!=nil {
for l2!=nil&&l2.Val<=l1.Val{
if p==nil{
p=l2;head=p
}else{
p.Next=l2;p=p.Next
}
l2=l2.Next
}
if p==nil{
p=l1;head=p
}else{
p.Next=l1;p=p.Next
}
l1=l1.Next
}
for l2!=nil{
if p==nil{
p=l2;head=p
}else{
p.Next=l2;p=p.Next
}
l2=l2.Next
}
return head
}