package main
import . "nc_tools"
/*
* type ListNode struct{
* Val int
* Next *ListNode
* }
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pHead1 ListNode类
* @param pHead2 ListNode类
* @return ListNode类
*/
func Merge( pHead1 *ListNode , pHead2 *ListNode ) *ListNode {
// write code here
// 比较两个链表节点大小取小者,其中一个链表遍历完毕后,将另一个链表全部加入新链表表尾即可
dummy := &ListNode{}
tail := dummy
for pHead1 != nil && pHead2 != nil {
if pHead1.Val < pHead2.Val {
tail.Next = pHead1
tail = tail.Next
pHead1 = pHead1.Next
} else {
tail.Next = pHead2
tail = tail.Next
pHead2 = pHead2.Next
}
}
if pHead1 != nil {
tail.Next = pHead1
tail = tail.Next
}
if pHead2 != nil {
tail.Next = pHead2
tail = tail.Next
}
return dummy.Next
}
- 使用一个哑结点作为虚拟头结点,统一所有节点的处理方式;
- 使用尾插法将两个链表当前节点中值较小的插入到新链表的表尾;
- 如果其中一个链表已经处理完了,如果另一个链表还有剩余的元素,那么说明这些元素也是链表中较大的那部分;
- 直接将这部分链接到链表表尾即可。