题意:

image.png

解题思路:

  1. 时间复杂度:O(n)
  2. 思路:
  3. 1. 新建头部虚拟节点dummy,设置cur指向dummy
  4. 2. 循环比较l1,l2大小,如果l1 <= l2,则cur指向l1,同时l1后移,反之指向l2
  5. 3. 一轮过后,cur后移一位;
  6. 3. 当条件不满足时,将剩余不为空的节点,接在cur后面;
  7. 4. 最后返回虚拟节点的下一个节点即可;

PHP代码实现:

  1. /**
  2. * Definition for a singly-linked list.
  3. * class ListNode {
  4. * public $val = 0;
  5. * public $next = null;
  6. * function __construct($val = 0, $next = null) {
  7. * $this->val = $val;
  8. * $this->next = $next;
  9. * }
  10. * }
  11. */
  12. class Solution {
  13. function mergeTwoLists($l1, $l2) {
  14. $dummy = new ListNode(0);
  15. $curNode = $dummy;
  16. while ($l1 != null && $l2 != null) {
  17. if ($l1->val <= $l2->val) {
  18. $curNode->next = $l1;
  19. $l1 = $l1->next;
  20. } else {
  21. $curNode->next = $l2;
  22. $l2 = $l2->next;
  23. }
  24. $curNode = $curNode->next;
  25. }
  26. $curNode->next = $l1 == null ? $l2 : $l1;
  27. return $dummy->next;
  28. }
  29. }

GO代码实现:

  1. /**
  2. * Definition for singly-linked list.
  3. * type ListNode struct {
  4. * Val int
  5. * Next *ListNode
  6. * }
  7. */
  8. func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
  9. dummy := &ListNode{}
  10. cur := dummy
  11. for l1 != nil && l2 != nil {
  12. if l1.Val <= l2.Val {
  13. cur.Next = l1
  14. l1 = l1.Next
  15. } else {
  16. cur.Next = l2
  17. l2 = l2.Next
  18. }
  19. cur = cur.Next
  20. }
  21. if l1 != nil {
  22. cur.Next = l1
  23. } else {
  24. cur.Next = l2
  25. }
  26. return dummy.Next
  27. }