206. 反转链表

迭代

  1. class Solution {
  2. public ListNode reverseList(ListNode head) {
  3. ListNode prev = null;
  4. ListNode curr = head;
  5. while (curr != null) {
  6. ListNode next = curr.next;
  7. curr.next = prev;
  8. prev = curr;
  9. curr = next;
  10. }
  11. return prev;
  12. }
  13. }

递归

  1. class Solution {
  2. public ListNode reverseList(ListNode head) {
  3. if (head == null && head.next == null) return head;
  4. ListNode node = reverseList(head.next);
  5. head.next.next = head;
  6. head.next = null;
  7. return node;
  8. }
  9. }

双链表反转

迭代

  1. class Solution {
  2. public DoubleNode reverseList(DoubleNode head) {
  3. DoubleNode prev = null;
  4. DoubleNode curr = head;
  5. while (head != null) {
  6. DoubleNode temp = head.next;
  7. head.next = prev;
  8. head.prev = curr;
  9. prev = head
  10. head = temp;
  11. }
  12. return prev;
  13. }
  14. }

21. 合并两个有序链表

虚拟头结点
1.gif

  1. class Solution {
  2. public ListNode mergeTwoLists(ListNode l1,ListNode l2) {
  3. // 虚拟头结点
  4. ListNode dummy = new ListNode(-1);
  5. ListNode p = dummy;
  6. ListNode p1 = l1;
  7. ListNode p2 = l2;
  8. while (p1 != null && p2 != null) {
  9. // 比较p1,p2的val,将较小值的节点移到p指针上
  10. if (p1.val > p2.val) {
  11. p.next = p2;
  12. p2 = p2.next;
  13. } else {
  14. p.next = p1;
  15. p1 = p1.next;
  16. }
  17. // p指针不断前进
  18. p = p.next;
  19. }
  20. if (p1 != null) {
  21. p.next = p1;
  22. }
  23. if (p2 != null) {
  24. p.next = p2;
  25. }
  26. return dummy.next;
  27. }
  28. }