질문 링크: Likou, GeeksforGeeks
문제 해결 아이디어
연결된 목록의 머리와 꼬리를 각각 가리키는 두 개의 포인터를 사용해야 합니다.
방법
1단계: 빠른 포인터와 느린 포인터 방법을 사용하여 연결 목록의 중간점을 찾습니다.
2단계: 연결 목록을 전반부 firstHalf
와 후반부 secondHalf
의 두 부분으로 나눕니다.
3단계: 연결 목록의 후반부를 반전하려면 reverse()
함수를 사용하세요.
4단계: 마지막 단계는 반전된 후반부와 전반부를 병합하여 최종 결과를 얻는 것입니다.
복잡성
코드
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode reverse(ListNode head){ ListNode prev = null; ListNode curr = head; ListNode next = head.next; while(next!=null){ curr.next = prev; prev = curr; curr = next; next = next.next; } curr.next = prev; return curr; } public void reorderList(ListNode head) { if(head == null || head.next == null ) return; // 使用快慢指针法找到链表的中点 ListNode slow = head; ListNode fast = head.next; while(fast!=null && fast.next!=null){ slow = slow.next; // 移动一次 fast = fast.next.next; // 移动两次 } // 将链表分成两部分 ListNode secondHalf = slow.next; // 将前半部分的尾节点设置为 null,断开连接 slow.next = null; // 反转后半部分 secondHalf = reverse(secondHalf); ListNode firstHalf = head; ListNode temp = secondHalf; // 合并两个链表 while(secondHalf!=null){ temp = temp.next; secondHalf.next = firstHalf.next; firstHalf.next = secondHalf; firstHalf = secondHalf.next; secondHalf = temp; } return; } }
더 많은 솔루션을 보려면 GitHub
를 방문하세요.르코 개인 홈페이지 : 르코 : devn007
GeeksforGeeks 개인 홈페이지: GFG: devnirwal16
위 내용은 재주문 목록: LC 매체, GFG 하드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!