leetcode l 체인 테이블 정렬 (체인 테이블 중간 노드, 체인 테이블 통합)
2359 단어 leetcode
링크:https://www.nowcoder.com/questionTerminal/d75c232a0405427098a8d1627930bea6출처: 우객망
병합 정렬의 일반적인 단계는 다음과 같습니다.
1) 정렬 대기 수조(체인표)를 중점으로 하고 둘로 나눈다.
2) 왼쪽 부분을 차례로 병합 정렬한다.
3) 귀착적으로 오른쪽 부분을 병합 정렬한다.
4) 두 부분을 합쳐서 결과를 얻는다.
그래서 이 문제에 대응하면 세 가지 작은 문제로 나눌 수 있다.
1) 체인 시계의 중점을 찾는다(빠른 바늘 사고방식, 빠른 바늘은 한 번에 두 걸음, 느린 바늘은 한 번에 한 걸음, 빠른 바늘은 체인 시계의 끝에 있을 때 느린 바늘은 체인 시계의 중점에 딱 맞다).
2) merge 함수, 즉 체인 테이블을 어떻게 통합하는지 쓴다.(merge-two-sorted-lists 문제 해석 참조)
3) mergesort 함수를 작성하여 상기 절차를 실현한다.
ListNode* findMiddle(ListNode *head){
ListNode* pPrev=head;
ListNode* pBehind =head->next;
while(pBehind->next!= nullptr && pBehind != nullptr){//
pPrev = pPrev->next;
pBehind =pBehind->next->next;
}
return pPrev;
}
ListNode *mergeList(ListNode* l1,ListNode*l2)
{
if(l1 == nullptr )
return l2;
if(l2 == nullptr)
return l1;
ListNode * head = new ListNode(0);
ListNode * node =head;
while(l1 != nullptr && l2 != nullptr){
if(l1->val < l2->val){
node->next=l1;
l1 =l1->next;
}
else {
node->next =l2;
l2=l2->next;
}
node=node->next;
}
if(l1 != nullptr)
node->next =l1;
if(l2 != nullptr)
node->next =l2;
return head->next;
}
//
ListNode* recursion_merge(ListNode*l1,ListNode*l2){
if(l1 ==nullptr)
return l2;
if(l2 == nullptr)
return l1;
ListNode * pMerge =nullptr;
if(l1->val < l2->val){
pMerge=l1;
pMerge->next=recursion_merge(l1->next,l2);
}else{
pMerge=l2;
pMerge->next=recursion_merge(l1,l2->next);
}
return pMerge;
}
ListNode *sortList(ListNode *head) {
if(head == nullptr || head->next == nullptr)
return head;
ListNode * middle = findMiddle(head);
ListNode* right = sortList(middle->next);
middle->next =nullptr;
ListNode* left = sortList(head);
return mergeList(left,right);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
0부터 시작하는 LeetCode Day8 「1302. Deepest Leaves Sum」해외에서는 엔지니어의 면접에 있어서 코딩 테스트라고 하는 것이 행해지는 것 같고, 많은 경우, 특정의 함수나 클래스를 주제에 따라 실장한다고 하는 것이 메인이다. 빠른 이야기가 본고장에서도 행해지고 있는 것 같은 코...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.