go合并两个有序列表

题目:

      将两个有序链表合并为一个新的有续链表并返回。新链表是通过拼接给定的两个链表的所有节点做成的。

思路:

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
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值